/**
 * 给定字符串，由括号和`I`构成。`I`表示光标位置
 * 4种操作：
 * 1. bakespace: 如果光标恰好位于左右括号之中，则删除左右括号，否则删除前一个字符
 * 2. delete：删除关闭后一个字符
 * 3. <-: 光标左移一格
 * 4. ->：光标右移一格
 * 用链表记录字符串，用It记录I的位置，然后直接模拟操作即可。
 * 前后加哨兵
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using vi = vector<int>;

int N, K;
string S;
list<char> List;
list<char>::iterator It;

void backspace(){
    auto pre = It;
    --pre;
    auto suf = It;
    ++suf;

    if('(' == *pre and ')' == *suf){
        List.erase(pre);
        List.erase(suf);
        return;
    }

    if(*pre != '#'){
        List.erase(pre);
    }
    
    return;
}

void mydelete(){
    auto suf = It;
    ++suf;

    if(*suf != '#'){
        List.erase(suf);
    }

    return;
}

void work(){
    cin >> N >> K >> S;
    
    List.emplace_back('#');
    for(char ch : S) List.emplace_back(ch);
    List.emplace_back('#');

    for(auto it=List.begin();;++it){
        if(*it == 'I'){
            It = it; break;
        }
    }

    string cmd;
    for(int q=1;q<=K;++q){
        cin >> cmd;
        if('b' == cmd[0]){
            backspace();
        }else if('d' == cmd[0]){
            mydelete();
        }else if('<' == cmd[0]){
            auto pre = It;
            --pre;
            if(*pre != '#'){
                swap(*pre, *It);
                It = pre;
            }
        }else if('-' == cmd[0]){
            auto suf = It;
            ++suf;
            if(*suf != '#'){
                swap(*suf, *It);
                It = suf;
            }
        }else{
            assert(0);
        }
    }

    for(auto it=++List.begin(),et=--List.end();it!=et;++it){
        cout << *it;
    }
    cout << "\n";
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}